package cn.zebra.dev.ibatis.plus.service;

import com.baomidou.mybatisplus.core.toolkit.support.SFunction;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * 简化版写法
 *
 * @author runnable@sina.cn
 * @date 2018年12月11日22:33:45
 */
public interface IService<T> extends com.baomidou.mybatisplus.extension.service.IService<T> {

    /**
     * 查询所有数据
     *
     * @return 返回List集合
     */
    List<T> selectList();

    /**
     * 更新记录
     *
     * @param entity 实体对象
     * @param sqlAnd 条件拼接
     * @param params 拼接参数
     * @return 成功返回true, 失败返回false
     */
    boolean update(T entity, String sqlAnd, Object... params);

    /**
     * 查询全部记录
     *
     * @param setSelect 查询列
     * @param sqlAnd    条件拼接
     * @param params    拼接参数
     * @return 查询记录
     */
    List<T> selectList(String setSelect, String sqlAnd, Object... params);

    /**
     * 查询全部记录
     *
     * @param sqlAnd 条件拼接
     * @param params 拼接参数
     * @return 查询记录
     */
    List<T> selectList(String sqlAnd, Object... params);

    /**
     * 查询全部记录
     *
     * @param sqlAnd 拼接条件
     * @param idList 实体id集合
     * @return 查询记录
     */
    List<T> selectBatch(String sqlAnd, List<Long> idList);

    /**
     * 查询全部记录
     *
     * @param ids(数组) 实体主键id
     * @return 查询记录
     */
    default Collection<T> selectBatchIds(Long[] ids) {
        return listByIds(Arrays.asList(ids));
    }

    /**
     * 删除记录
     *
     * @param ids(数组) 实体主键id
     * @return 成功返回true 失败返回 false
     */
    default boolean deleteBatchIds(Long[] ids) {
        return removeByIds(Arrays.asList(ids));
    }

    T selectOne(Long id);

    T selectOne(String sqlAnd, Object... params);

    Integer count(String sqlAnd, Object... params);

    boolean delete(String sqlAnd, Object... params);

    default List<T> findList() {
        return selectList();
    }

    /**
     * 根据主键id查找对应记录
     *
     * @param id 主键id
     * @return 实体
     */
    T findById(Long id);

    /**
     * 根据字段和字段值匹配对象
     *
     * @param field 字段
     * @param value 字段值
     * @return 实体对象
     */
    T findByFieldValue(SFunction<T, ?> field, Object value);

    /**
     * 根据字段和字段值匹配对象集合
     *
     * @param field 字段
     * @param value 字段值
     * @return 实体对象集合
     */
    List<T> findListByFieldValue(SFunction<T, ?> field, Object value);
}
